package presenter;

import com.toedter.calendar.JDateChooser;
import dzienPracy.DzienPracy;
import model.TableModel;
import org.joda.time.DateTime;
import widok.Okienko;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Presenter {
    private JDateChooser dateChooser;
    private JSpinner godzinaWejsciaSP;
    private JSpinner minutaWejsciaSP;
    private JSpinner godzinaWyjsciaSP;
    private JSpinner minutaWyjsciaSP;
    private JButton zapiszBT;
    private JTable tabela;
    private JButton usunBT;
    private JLabel iloscGodzinLB;

    class SluchaczPrzyciskuZapiszBT implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (czyPoprawneDaneWFormularzu() ){
                TableModel tableModel = (TableModel) tabela.getModel();
                if (tableModel.czyJestJuzTakaData(dateChooser.getDate())) {
                    JOptionPane.showMessageDialog(
                            null,
                            "Podana data już istnieje",
                            "Uwaga",
                            JOptionPane.INFORMATION_MESSAGE);
                }  else {
                    dodajDoTabelki();
                }
            } else {
                JOptionPane.showMessageDialog(
                        null,
                        "Podałeś nieprawidłowe dane",
                        "Uwaga",
                        JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }

    class SluchaczPrzyciskuUsunBT implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            int numerWiersza = tabela.getSelectedRow();
            if(numerWiersza == -1){
                JOptionPane.showMessageDialog(
                        null,
                        "Nie zaznczono wiersza",
                        "Uwaga",
                        JOptionPane.ERROR_MESSAGE);
            } else {
                TableModel tableModel = (TableModel) tabela.getModel();
                tableModel.usunWiersz(numerWiersza);
                iloscGodzinLB.setText(tableModel.sumaPrzepracowanychGodzinST());
            }

        }
    }

    private void dodajDoTabelki() {
        int godzinaWejscia = Integer.parseInt(godzinaWejsciaSP.getValue().toString());
        int minutyWejscia = Integer.parseInt(minutaWejsciaSP.getValue().toString());
        int godzinaWyjscia = Integer.parseInt(godzinaWyjsciaSP.getValue().toString());
        int minutyWyjscia = Integer.parseInt(minutaWyjsciaSP.getValue().toString());

        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(dateChooser.getDate());

        calendar.set(Calendar.HOUR, godzinaWejscia);
        calendar.set(Calendar.MINUTE, minutyWejscia);
        DateTime czasWejscia = new DateTime(calendar.getTime());

        calendar.set(Calendar.HOUR, godzinaWyjscia);
        calendar.set(Calendar.MINUTE, minutyWyjscia);
        DateTime czasWyjscia = new DateTime(calendar.getTime());

        DzienPracy dzienPracy = new DzienPracy(dateChooser.getDate(), czasWejscia, czasWyjscia);

        TableModel tableModel = (TableModel)tabela.getModel();
        tableModel.dodajWiersz(dzienPracy);

        iloscGodzinLB.setText(tableModel.sumaPrzepracowanychGodzinST());
    }

    public boolean czyPoprawneDaneWFormularzu() {
        try {
            int godzinaWejscia = Integer.parseInt(godzinaWejsciaSP.getValue().toString());
            int minutaWejscia = Integer.parseInt(minutaWejsciaSP.getValue().toString());
            int godzinaWyjscia = Integer.parseInt(godzinaWyjsciaSP.getValue().toString());
            int minutaWyjscia = Integer.parseInt(minutaWyjsciaSP.getValue().toString());

            if (godzinaWejscia < 24 && godzinaWejscia >= 0 &&
                    minutaWejscia < 60 && minutaWejscia >= 0 &&
                    godzinaWyjscia < 24 && godzinaWyjscia >= 0 &&
                    minutaWyjscia < 60 && minutaWyjscia >= 0) {
                if (godzinaWejscia < godzinaWyjscia || godzinaWejscia == godzinaWyjscia && minutaWejscia < minutaWyjscia)
                    return true;
                else
                    return false;
            } else {
                return false;
            }
        } catch (NumberFormatException e) {
            return false;
        }

    }

    public ArrayList<DzienPracy> pobierzDniPracyZPliku(){
        ArrayList <DzienPracy> wierszeTabeli= new ArrayList<DzienPracy>();
        try {
            FileInputStream fis = new FileInputStream(Okienko.FILE_NAME);
            BufferedInputStream bis = new BufferedInputStream(fis);
            ObjectInputStream ois = new ObjectInputStream(bis);

            wierszeTabeli = (ArrayList<DzienPracy>) ois.readObject();

           return wierszeTabeli;
        } catch (Exception e) {
            return null;
        }
    }


    public void setDateChooser(JDateChooser dateChooser) {
        this.dateChooser = dateChooser;
    }

    public void setGodzinaWejsciaSP(JSpinner godzinaWejsciaSP) {
        this.godzinaWejsciaSP = godzinaWejsciaSP;
    }

    public void setMinutaWejsciaSP(JSpinner minutaWejsciaSP) {
        this.minutaWejsciaSP = minutaWejsciaSP;
    }

    public void setGodzinaWyjsciaSP(JSpinner godzinaWyjsciaSP) {
        this.godzinaWyjsciaSP = godzinaWyjsciaSP;
    }

    public void setMinutaWyjsciaSP(JSpinner minutaWyjsciaSP) {
        this.minutaWyjsciaSP = minutaWyjsciaSP;
    }

    public void setZapiszBT(JButton zapiszBT) {
        this.zapiszBT = zapiszBT;
        this.zapiszBT.addActionListener(new SluchaczPrzyciskuZapiszBT());
    }

    public void setTabela(JTable tabela) {
        this.tabela = tabela;
        ArrayList<DzienPracy> dniPracy = pobierzDniPracyZPliku();
        TableModel tableModel = (TableModel) this.tabela.getModel();
        tableModel.setWierszeTabeli(dniPracy);
    }

    public void setUsunBT(JButton usunBT) {
        this.usunBT = usunBT;
        this.usunBT.addActionListener(new SluchaczPrzyciskuUsunBT());
    }

    public void setIloscGodzinLB(JLabel iloscGodzinLB) {
        this.iloscGodzinLB = iloscGodzinLB;
    }


}
